#include<bits/stdc++.h>
using namespace std;
typedef double db;
db f(vector<db> p){
  int n=p.size();
  vector<db> pr(n),sf(n);
  for(int i=0;i<n;i++)
    pr[i]=(i?pr[i-1]:1)*p[i];
  for(int i=n-1;~i;i--)
    sf[i]=(i<n-1?sf[i+1]:1)*(1-p[i]);
  db c=0;
  for(int i=0;i<=n;i++)
    c+=(i?pr[i-1]:1)*(i<n?sf[i]:1);
  return c;
}
struct S{
  db p,s,r;
  S(db p=0,db s=0,db r=0):p(p),s(s),r(r){}
  inline S set(db x){return p=x,s=1-x,r=1,*this;}
};
inline S op(const S &x,const S &y){
  return S(x.p*y.p,x.s*y.s,x.p*y.r+y.s*x.r-x.p*y.s);
}
class segtree{
  private:
    int k,m;
    vector<S> s;
    inline void pushup(int u){
      s[u]=op(s[u<<1],s[u<<1|1]);
    }
  public:
    segtree(vector<S> a){
      int n=a.size();
      k=__lg(n)+(__builtin_popcount(n)>1);
      s.resize((m=1<<k)<<1);
      for(int i=0;i<n;i++)
        s[i+m]=a[i];
      for(int i=m-1;i;i--)
        pushup(i);
    }
    inline void set(int p,S x){
      s[p+=m]=x;
      for(int i=1;p>>i;i++)
        pushup(p>>i);
    }
    inline S all_prod(){return s[1];}
};
int main(){
  freopen("sleep.in","r",stdin);
  freopen("sleep.out","w",stdout);
  ios::sync_with_stdio(false);
  cin.tie(0); cout.tie(0);
  int n,k; cin>>n>>k;
  vector<db> p(n);
  for(auto &i:p){
    int a,b; cin>>a>>b,i=(db)a/b;
  }
  sort(p.begin(),p.end(),greater<>());
  db r=0;
  vector<S> a(k);
  for(int i=0;i<k;i++)
    a[i].set(p[i]);
  segtree t(a);
  for(int i=0;i<=k;i++){
    r=max(r,t.all_prod().r);
    if(i<k)t.set(k-i-1,a[k-i-1].set(p[n-i-1]));
  }
  cout<<fixed<<setprecision(9)<<1-r<<endl;
  return 0;
}